package com.ykdl.member.dictionary;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.content.SharedPreferences;
import android.text.TextUtils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ykdl.member.kid.util.AssertTool;

public class DictionaryUtil {
	public interface OnDictUpdateListener {
		void onUpdateSuccess();
	}

	private static final String TAG = "DictionaryUtil";
	public static final String SP_DICT_UPDATE = "dictionary_update";
	public static final String FOLDER_BASE = "dict";
	public static final String FILE_VERSION = "version";
	public static final String KEY_DATA = "data";
	public static final int MESSAGE_RETRY = 1;
	public static final int MESSAGE_UPDATE_PROGRESS = 2;
	public static final int MESSAGE_UPDATE_NUM = 3;
	public static final int MESSAGE_FAILED = 4;
	public static final int MESSAGE_UPDATE_SUCCESS = 5;

//	private DownloadProgressDialog mDialog;

	private List<Dictionary> mFailedDictList = new ArrayList<Dictionary>();
	private int retryCount;
	private boolean mRetry;

	private OnDictUpdateListener mUpdateListener;
	private static DictionaryUtil mInstance = new DictionaryUtil();
//	private OnDownloadListener mListener = new OnDownloadListener() {
//
//		@Override
//		public void onDownloadSuccess(Dictionary dic) {
//			for (Dictionary dict : mFailedDictList) {
//				if (dict.getUrl().equals(dic.getUrl())) {
//					mFailedDictList.remove(dic);
//					break;
//				}
//			}
//		}
//
//		@Override
//		public void onDownloadFailed(Dictionary dic) {
//			for (Dictionary dict : mFailedDictList) {
//				if (dict.getUrl().equals(dic.getUrl())) {
//					return;
//				}
//			}
//			mFailedDictList.add(dic);
//		}
//
//		@Override
//		public void onDownloadFinished(Dialog dialog) {
//			if (dialog != null) {
//				try {
//					dialog.dismiss();
//				} catch (Exception e) {
//
//				}
//			}
//			if (!mFailedDictList.isEmpty()) {
//				if (retryCount < 1) {
//					Message msg = mHandler.obtainMessage();
//					msg.what = MESSAGE_RETRY;
//					mHandler.sendMessage(msg);
//					// alert.getWindow().setType(
//					// WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
//					// alert.show();
//					retryCount += 1;
//				} else {
//					Message msg = mHandler.obtainMessage();
//					msg.what = MESSAGE_FAILED;
//					mHandler.sendMessage(msg);
//					retryCount = 0;
//				}
//
//			} else {
//				Message msg = mHandler.obtainMessage();
//				msg.what = MESSAGE_UPDATE_SUCCESS;
//				mHandler.sendMessage(msg);
//				retryCount = 0;
//			}
//
//		}
//
//	};

	private DictionaryUtil() {

	}

	public static DictionaryUtil getInstance() {
		return mInstance;
	}

//	private Handler mHandler = new Handler() {
//
//		@Override
//		public void handleMessage(android.os.Message msg) {
//			switch (msg.what) {
//			case MESSAGE_RETRY:
//				AlertButton button = new AlertButton(
//						DialogInterface.BUTTON_POSITIVE, R.string.reload,
//						new AlertUtils.OnClickListener() {
//
//							@Override
//							public void onClick(AlertButton button) {
//								mRetry = true;
//								startUpdateDic(
//										PositionInviteApplication.getInstance(),
//										mFailedDictList);
//								mRetry = false;
//								mFailedDictList.clear();
//							}
//						});
//				Activity parent = PositionInviteApplication.getInstance()
//						.getCurrentActivity();
//				while (parent.getParent() != null) {
//					parent = parent.getParent();
//				}
//				AlertUtils.alert(parent,
//						parent.getString(R.string.alert_title_download_failed),
//						parent.getString(R.string.message_redownoad),
//						new AlertUtils.AlertButton[] { button }, false);
//				break;
//			case MESSAGE_UPDATE_PROGRESS:
//				int progress = (Integer) msg.obj;
//				mDialog.setProgress(progress);
//				break;
//			case MESSAGE_UPDATE_NUM:
//				mDialog.setDownloadNum(msg.arg1, msg.arg2);
//				break;
//			case MESSAGE_FAILED:
//				AlertButton btn = new AlertButton(
//						DialogInterface.BUTTON_POSITIVE, R.string.confirm,
//						new AlertUtils.OnClickListener() {
//
//							@Override
//							public void onClick(AlertButton button) {
//
//							}
//						});
//				Activity activity = PositionInviteApplication.getInstance()
//						.getCurrentActivity();
//				while (activity.getParent() != null) {
//					activity = activity.getParent();
//				}
//				AlertUtils.alert(activity,
//						activity.getString(R.string.alert_title_net_error),
//						activity.getString(R.string.message_net_error),
//						new AlertUtils.AlertButton[] { btn }, false);
//				break;
//			case MESSAGE_UPDATE_SUCCESS:
//
//				// clear dictionary cache
//				clearCache();
//				DictionaryCache.getInstance().setCurVersion(null);
//				if (mUpdateListener != null) {
//					mUpdateListener.onUpdateSuccess();
//				}
//				break;
//			default:
//				break;
//			}
//		};
//	};

//	public void startUpdateDic(Context context, List<Dictionary> dictList) {
//		DictionaryLoader.getInstance().setOnDownloadListener(mListener);
//		Activity parent = PositionInviteApplication.getInstance()
//				.getCurrentActivity();
//		while (parent.getParent() != null) {
//			parent = parent.getParent();
//		}
//		// if (!StorageHelper.checkStorageState()) {
//		// return;
//		// }
//		if (mDialog == null || !mDialog.isShowing() || mRetry) {
//			mDialog = new DownloadProgressDialog(parent);
//			// dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//			// dialog.setContentView(R.layout.dialog_download_progress);
//			mDialog.setProgress(0);
//			mDialog.setCancelable(false);
//			mDialog.setTitle(null);
//			mDialog.show();
//			// mDialog.setDownloadNum(0, dictList.size());
//		} else {
//
//		}
//
//		DictionaryLoader.getInstance().asyncDownload(context, mDialog,
//				dictList, mHandler);
//	}

//	public JSONObject getCurrentVersion(Context context) {
//		File fileDir = new File(context.getFilesDir() + File.separator
//				+ FOLDER_BASE);
//		File[] files = fileDir.listFiles();
//		JSONObject obj = DictionaryCache.getInstance().getCurVersion();
//		if (obj == null || obj.isEmpty()) {
//			obj = getVersionFromAssets(context);
//			if (fileDir != null) {
//				if (files == null) {
//					// return obj.toString();
//				} else {
//					for (int i = 0; i < files.length; i++) {
//						String versionData = readVersionFromFiles(context,
//								files[i]);
//						if (TextUtils.isEmpty(versionData)) {
//							continue;
//						} else {
//							LogUtil.d(TAG, "data version in files dir:  "
//									+ versionData);
//							JSONObject object = JSONObject
//									.parseObject(versionData);
//							try {
//								int assetsVersion = obj.getIntValue(object
//										.getString(AssertTool.KEY_NAME));
//								int fileVersion = object
//										.getIntValue(AssertTool.KEY_VERSION);
//								if (assetsVersion < fileVersion) {
//									obj.put(object
//											.getString(AssertTool.KEY_NAME),
//											object.get(AssertTool.KEY_VERSION));
//								}
//							} catch (Exception e) {
//								obj.put(object.getString(AssertTool.KEY_NAME),
//										object.get(AssertTool.KEY_VERSION));
//							}
//
//						}
//					}
//				}
//
//			}
//		}
//		DictionaryCache.getInstance().setCurVersion(obj);
//		return obj;
//	}

	/**
	 * 从assets目录中读取版本号
	 * 
	 * @param context
	 * @return
	 */
//	private JSONObject getVersionFromAssets(Context context) {
//		JSONObject obj = new JSONObject();
//		try {
//			AssetManager assertManager = context.getAssets();
//			String[] files = assertManager.list(AssertTool.DATA_PATH
//					+ File.separator + AssertTool.FOLDER_VERSION);
//			if (files == null) {
//				return null;
//			} else {
//				for (int i = 0; i < files.length; i++) {
//					String jsonData = AssertTool.readDataFromAssertsFile(
//							context, AssertTool.DATA_PATH + File.separator
//									+ AssertTool.FOLDER_VERSION
//									+ File.separator + files[i]);
//					JSONObject object = JSONObject.parseObject(jsonData);
//					obj.put(object.getString(AssertTool.KEY_NAME),
//							object.get(AssertTool.KEY_VERSION));
//				}
//			}
//		} catch (Exception e) {
//			e.printStackTrace();
//			return null;
//		}
//		return obj;
//
//	}

	private String readVersionFromFiles(Context context, File file) {
		FileInputStream fis = null;
		StringBuffer sb = new StringBuffer();
		try {
			File[] files = file.listFiles();
			if (files == null) {
				return null;
			}
			if (checkModify(context, files)) {
				DictionaryCache.getInstance().setCurVersion(null);
			}
			for (int i = 0; i < files.length; i++) {
				if (files[i].getName().contains(FILE_VERSION)) {
					fis = new FileInputStream(files[i]);
					BufferedReader br = new BufferedReader(
							new InputStreamReader(fis, "utf-8"));
					String data = "";
					while ((data = br.readLine()) != null) {
						sb.append(data);
					}
					br.close();
					break;
				}

			}

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		return sb.toString().trim();
	}

	private boolean checkModify(Context context, File[] files) {
		SharedPreferences sp = context.getSharedPreferences(SP_DICT_UPDATE,
				Context.MODE_PRIVATE);
		if (files == null) {
			return false;
		}
		File parent = files[0].getParentFile();
		long folderCreateTime = sp.getLong(parent.getName(), -1);
		if (folderCreateTime == -1) {
			return true;
		} else {
			long lastModify = parent.lastModified();
			if (lastModify > folderCreateTime) {
				return true;
			}
		}
		for (int i = 0; i < files.length; i++) {
			long createTime = sp.getLong(files[i].getName(), -1);
			if (createTime == -1) {
				return true;
			} else {
				long lastModify = files[i].lastModified();
//				LogUtil.d(TAG, "===last modify===" + lastModify
//						+ "---create time---" + createTime);
				if (lastModify > createTime) {
					return true;
				}
			}
		}

		return false;

	}

	public void storeDownloadTime(Context context, File file) {
		SharedPreferences sp = context.getSharedPreferences(SP_DICT_UPDATE,
				Context.MODE_PRIVATE);
		sp.edit().putLong(file.getName(), file.lastModified()).commit();
	}

	private static File checkNewVersionExist(Context context, String fileName) {
		File fileDir = new File(context.getFilesDir() + File.separator
				+ FOLDER_BASE);
		if (fileDir != null) {
			File[] folders = fileDir.listFiles();
			if (folders == null) {
				return null;
			} else {
				for (int i = 0; i < folders.length; i++) {
					File[] files = folders[i].listFiles();
					if (files == null) {
						return null;
					} else {
						for (int j = 0; j < files.length; j++) {
							if (fileName.equals(files[j].getName())) {
								return files[j];
							}
						}
					}
				}
			}

		}
		return null;
	}

	public String readFileData(Context context, File file) {
		FileInputStream fis = null;
		StringBuffer sb = new StringBuffer();
		try {
			fis = new FileInputStream(file);
			BufferedReader br = new BufferedReader(new InputStreamReader(fis,
					"utf-8"));
			String data = "";
			while ((data = br.readLine()) != null) {
				sb.append(data);
			}
			br.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return sb.toString().trim();
	}

//	/**
//	 * @deprecated
//	 * @param context
//	 * @param fileName
//	 * @return
//	 */
//	public JSONArray getDictData(Context context, String fileName) {
//		String jsonData = "";
//		JSONArray data = null;
//		File file = checkNewVersionExist(context, fileName);
//		if (file != null) {
//			jsonData = getNewestDictData(context, file);
//		}
//		if (TextUtils.isEmpty(jsonData)) {
//			jsonData = AssertTool.readDataFromAssertsFile(context,
//					AssertTool.DATA_PATH + File.separator + fileName);
//		}
//
//		if (TextUtils.isEmpty(jsonData)) {
//			return null;
//		} else {
//			try {
//				JSONObject obj = JSONObject.parseObject(jsonData);
//				data = obj.getJSONArray(KEY_DATA);
//			} catch (Exception e) {
//				if (file != null) {
//					// File parent = file.getParentFile();
//					// if (parent != null) {
//					// File[] files = parent.listFiles();
//					// if (files != null) {
//					// for (int i = 0; i < files.length; i++) {
//					// files[i].delete();
//					// }
//					// }
//					//
//					// }
//					jsonData = AssertTool.readDataFromAssertsFile(context,
//							AssertTool.DATA_PATH + File.separator + fileName);
//					JSONObject obj = JSONObject.parseObject(jsonData);
//					data = obj.getJSONArray(KEY_DATA);
//				}
//			}
//
//		}
//
//		return data;
//	}

	public JSONObject readDictData(Context context, String fileName) {
		String jsonData = "";
		File file = checkNewVersionExist(context, fileName);
		long size = 0;
//		if (file != null) {
//			jsonData = getNewestDictData(context, file);
//		}
		if (TextUtils.isEmpty(jsonData)) {
			jsonData = com.ykdl.member.kid.util.AssertTool.readDataFromAssertsFile(context,
					AssertTool.DATA_PATH + File.separator + fileName);
			size = jsonData.getBytes().length * 3;
		} else {
			size = file.length() * 3;
		}

		if (TextUtils.isEmpty(jsonData)) {
			return null;
		} else {
			try {
				JSONObject obj = JSONObject.parseObject(jsonData);
				DictionaryCache.getInstance().putDataToCache(fileName, obj,
						size);
				return obj;
			} catch (Exception e) {
				e.printStackTrace();
				return null;
			}

		}
	}

//	private String getNewestDictData(Context context, File file) {
//		String jsonData = "";
//		File parent = file.getParentFile();
//		String versionData = readVersionFromFiles(context, parent);
//		if (TextUtils.isEmpty(versionData)) {
//			jsonData = null;
//		} else {
//			JSONObject object = JSONObject.parseObject(versionData);
//			try {
//				JSONObject obj = getCurrentVersion(context);
//				int curVersion = obj.getIntValue(object
//						.getString(AssertTool.KEY_NAME));
//				int fileVersion = object.getIntValue(AssertTool.KEY_VERSION);
//				if (curVersion > fileVersion) {
//					jsonData = null;
//				} else {
//					jsonData = readFileData(context, file);
//				}
//			} catch (Exception e) {
//				jsonData = null;
//			}
//		}
//		return jsonData;
//	}

	/**
	 * @deprecated
	 * @param context
	 * @param fileName
	 * @return
	 */
//	public JSONObject getDictDataObject(Context context, String fileName) {
//		String jsonData = "";
//		JSONObject data = null;
//		File file = checkNewVersionExist(context, fileName);
//		if (file != null) {
//			jsonData = getNewestDictData(context, file);
//		}
//		if (TextUtils.isEmpty(jsonData)) {
//			jsonData = AssertTool.readDataFromAssertsFile(context,
//					AssertTool.DATA_PATH + File.separator + fileName);
//		}
//
//		if (TextUtils.isEmpty(jsonData)) {
//			return null;
//		} else {
//			try {
//				JSONObject obj = JSONObject.parseObject(jsonData);
//				data = obj.getJSONObject(KEY_DATA);
//			} catch (Exception e) {
//				if (file != null) {
//					// File parent = file.getParentFile();
//					// if (parent != null) {
//					// File[] files = parent.listFiles();
//					// if (files != null) {
//					// for (int i = 0; i < files.length; i++) {
//					// files[i].delete();
//					// }
//					// }
//					//
//					// }
//
//					jsonData = AssertTool.readDataFromAssertsFile(context,
//							AssertTool.DATA_PATH + File.separator + fileName);
//					JSONObject obj = JSONObject.parseObject(jsonData);
//					data = obj.getJSONObject(KEY_DATA);
//				}
//			}
//
//		}
//
//		return data;
//	}

	private void clearCache() {
		DictionaryCache.getInstance().clearCache();
	}

	public void setOnDictUpdateListener(OnDictUpdateListener listener) {
		mUpdateListener = listener;
	}
}
